import {
  Controller,
  Get,
  Query,
  Header,
  Req,
  Res,
  UseGuards,
  Sse,
  Render,
} from '@nestjs/common';
import { AppService } from './app.service';
import { Observable } from 'rxjs';

import fs from 'fs';

type MessageEvent = any;

/* 装饰器、控制器，负责 HTTP请求，响应 */
// 指明这个类是控制器
// @Controller() 是注册路由的可选前缀
@Controller()
export class AppController {
  // private：服务，依赖相关的插入值
  constructor(private readonly appService: AppService) {
    // 简写
    // this.appService = new AppService();
  }

  // 指明处理方法, 能够写具体的路径
  // 传参 query，body，param
  @Get()
  getHello(@Res() res, @Req() request: any): any {
    // 访问特定 路由 返回特定页面
    // console.log('request', request.path)

    // 重定向
    res.redirect('/index');
  }

  // 股票接口待完善
  @Get('/stocks')
  @Header('X-UA-Compatible', 'IE=edge,chrome=1') // 指定自定义响应标头
  getStocks(@Req() request: any): string {
    // 响应，这里的响应与业务相关，交给service去做
    return this.appService.getHello(request);
  }

  // SSE (server-sent events) 服务端推送
  // 数据格式方面， SSE 使用的是 UTF8 编码的文本格式，只支持 UTF8编码
  // 使用两个换行符来分隔前后的消息，每条消息支持4种属性，属性名和属性值之间用冒号区分，新起一行（即使用一个换行符）创建下一个属性。
  @Sse('sse')
  @Header('Access-Control-Allow-Origin', '*')
  sse(): Observable<MessageEvent> {
    return this.appService.getSse();
  }

  @Get('/out')
  // 接收到参数，并且发送给service中去使用
  // 数据库连接还需要 DTO data transport Object
  getOut(@Query() obj: string): string {
    console.group('获取query中的name属性', obj);
    console.groupEnd();
    // return "hello out ！！！"
    return this.appService.getOut(obj['name']);
  }

  @Get('/index')
  @Render('index')
  // 能够访问静态文件
  // Render 是用来指定文件重新渲染方法
  getIndex(): { message: string } {
    return { message: 'hello ejs page' };
  }
}
